﻿/*
7-18 二分法求多项式单根 (20 分)
二分法求函数根的原理为：如果连续函数f(x)在区间[a,b]的两个端点取值异号，即f(a)f(b)<0，则它在这个区间内至少存在1个根r，即f(r)=0。

二分法的步骤为：

检查区间长度，如果小于给定阈值，则停止，输出区间中点(a+b)/2；否则
如果f(a)f(b)<0，则计算中点的值f((a+b)/2)；
如果f((a+b)/2)正好为0，则(a+b)/2就是要求的根；否则
如果f((a+b)/2)与f(a)同号，则说明根在区间[(a+b)/2,b]，令a=(a+b)/2，重复循环；
如果f((a+b)/2)与f(b)同号，则说明根在区间[a,(a+b)/2]，令b=(a+b)/2，重复循环。

本题目要求编写程序，计算给定3阶多项式f(x)=a
​​ ，在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式：
在一行中输出该多项式在该区间内的根，精确到小数点后2位。

输入样例：
3 -1 -3 1
-0.5 0.5
输出样例：
0.33
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const double EPS = 0.01;

double f(double a[], int n, double x) {
	double s = 0;
	for (int i = n; i > 0; i--)
		s = (s + a[i]) * x;
	return s + a[0];
}

int main() {
	freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/zju_C_Basic/data/7.18.txt", "r", stdin);
	int n = 3;
	double A[4] = {};
	for (int i = 3; i >= 0; i--)
		scanf("%lf", A + i);

	double a, b, x;
	double ya, yb, y;
	scanf("%lf %lf", &a, &b);
	ya = f(A, n, a);
	yb = f(A, n, b);
	if (fabs(ya)<0.0001)
		x = a;
	else if (fabs(yb) < 0.0001)
		x = b;
	else {
		while (ya * yb < 0) {
			x = (a + b) / 2;
			if (b - a < EPS)
				break;
			y = f(A, n, x);
			if (y == 0)
				break;
			if (y * ya > 0) {
				a = x;
				ya = y;
			}
			else {
				b = x;
				yb = y;
			}
		}
	}

	printf("%.2lf", x);

	return 0;
}